home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 1995 #1
/
Amiga Plus 1995 #1.iso
/
fish-disketten
/
fish_941-950
/
d949
/
bbbbs
/
bbbbs65.lha
/
rexx
/
bbsExtDL.baud
< prev
next >
Wrap
Text File
|
1993-10-29
|
16KB
|
600 lines
/* $VERS: bbsExtDL.baud 6.5 (29.10.93)
copyright 1992 Richard Lee Stockton
FREELY DISTRIBUTABLE
Allows BBBBS user to download from extra devices like CD drives.
Keeps track of time left to this user, and watches for hangup.
Just ignores file or directory names that contain spaces
because BBBBS would be unable to download them anyway.
Ignores icons (files that end in .info).
A textfile in BBS:Lists, CD_Exclude, controls exclusion of
drawers on certain CDs that contain copyright files. Other
specific files or directories can be excluded by adding
their paths to the CD_Exclude textfile, one path per line.
Super-sysop may select very large directories and have their
formatted display lists cached as textfiles in bbspath'Cache'.
This can greatly improve access time for very large drawers,
especially if they contain sub-directories.
*/
SIGNAL ON BREAK_C
SIGNAL ON BREAK_E
PARSE ARG name level maxtime linesperpage colorflag devlist
exclude=''
bbspath=GETCLIP('BBS_path')
x=OPEN(f,bbspath'Lists/CD_Exclude','R')
IF x~=0 THEN exclude=READCH(f,65000)
CALL CLOSE(f)
exclude=UPPER(TRANSLATE(exclude,' ','0A'x))
lists.=''
lists.0=0
maxtime=maxtime-30
CALL TIME('R')
CR='0D'x
def=''
pen3='
'
IF colorflag~=1 THEN
DO
def=''
pen3=''
END
SAY CR
x=OPEN(f,bbspath'BBS_TEXT/EXT_INFO','R')
IF x=0 THEN SAY bbspath'BBS_TEXT/EXT_INFO failed to open!'CR
ELSE
DO
DO i=1 WHILE ~EOF(f)
SAY READLN(f)||CR
END
CALL CLOSE(f)
END
selected=''
path=''
templist=devlist
devlist=''
longest=0
CALL PRAGMA('W','N') /* disk requesters OFF */
CALL PRAGMA('D',bbspath'Information')
test3=PRAGMA('D')
DO i=1 TO WORDS(templist)
test=WORD(templist,i)
IF ~EXISTS(test) THEN ITERATE i
CALL PRAGMA('D',test)
test2=PRAGMA('D')
IF test2=test3 THEN ITERATE i
IF WORDS(test2)>1 THEN test2=test
devlist=STRIP(devlist test2)
IF LENGTH(test2)>longest THEN longest=LENGTH(test2)
END
cols=76%(longest+8)
IF devlist='' THEN
DO
SAY CR
SAY '*** Sorry, no External Devices are available! ***'CR
SAY CR
OPTIONS PROMPT 'Press RETURN'
PULL junk
EXIT('')
END
picklist=devlist
IF WORDS(picklist)=1 THEN
DO
path=picklist
IF RIGHT(path,1)~=':' THEN path=path'/'
picklist=makepicklist()
END
ELSE
DO
lists.0=1
dirs=WORDS(devlist)
END
CALL checkdcd()
OPTIONS PROMPT 'Press RETURN'
PULL junk
DO loop=1
CALL checkdcd()
test=TIME('E')
IF test>(maxtime-100) THEN
DO
SAY CR
IF test>maxtime THEN
DO
SAY '*** This session''s time is expiring! ***'CR
SAY CR
LEAVE loop
END
ELSE SAY '*** Less than 2 minutes remaining! ***'CR
SAY CR
END
filename=pick(picklist)
IF filename='' THEN
DO
temp=path
IF RIGHT(temp,1)='/' THEN temp=LEFT(temp,LENGTH(temp)-1)
IF FIND(UPPER(devlist),UPPER(temp))>0 THEN
DO
IF WORDS(devlist)=1 THEN ITERATE loop
picklist=devlist
path=''
ITERATE loop
END
ELSE
DO
test=RIGHT(path,1)
IF test='/' THEN path=LEFT(path,LENGTH(path)-1)
slash=LASTPOS('/',path)
IF slash=0 THEN slash=LASTPOS(':',path)
path=LEFT(path,slash)
END
END
IF filename=':-)' THEN ITERATE loop
tempath=path||filename
temp=WORD(STATEF(tempath),1)
IF temp='FILE' THEN
DO
IF FIND(UPPER(selected),UPPER(tempath))=0 THEN
selected=selected tempath
ELSE selected=DELWORD(selected,FIND(UPPER(selected),UPPER(tempath)),1)
shosel=''
ITERATE loop
END
ELSE IF temp='DIR' THEN
DO
path=tempath
test=RIGHT(path,1)
IF test~='' & test~='/' & test~=':' THEN path=path'/'
END
ELSE IF UPPER(filename)='DONE' THEN LEAVE loop
IF path~='' THEN picklist=makepicklist()
END
selected=STRIP(selected)
test=''
IF WORDS(selected)=1 THEN test=UPPER(RIGHT(selected,4))
IF selected~='' & test~='.LHA' & test~='.LZH' & test~='.DMS' & test~='.ZOO' THEN
DO
SAY CR
SAY 'You may choose to have your selection(s) archived using LhA.'CR
SAY 'This makes downloading faster, if the files are not already compressed.'CR
SAY 'The completed archive will be attached to email addressed to you.'CR
SAY CR
OPTIONS PROMPT 'Archive selected files? (nY) > '
PULL temp
IF LEFT(temp,1)~='N' THEN
DO
ADDRESS AREXX bbsArcExt.rexx name selected
selected=''
SAY CR
SAY 'BBBBS will notify you online when your archive is ready.'CR
SAY CR
END
END
IF ADDRESS()='BAUD' THEN SAY 'Returning to the BBS...'CR
SAY CR
EXIT selected
checkdcd:
IF ADDRESS()~='BAUD' THEN RETURN
dcd
IF RC~=0 THEN RETURN
CALL DELAY(128)
dcd
IF RC=0 THEN
DO
SAY CR
SAY '*** Lost Carrier while using bbsExtDL.baud ***'CR
EXIT('')
END
RETURN
makepicklist:
IF path='' THEN RETURN ''
IF STORAGE()<100000 THEN
DO
lists.=''
lists.0=0
IF WORDS(devlist)>1 THEN
DO
lists.0=1
lists.1.0=devlist
END
END
DO i=1 TO lists.0
IF path=lists.i THEN RETURN lists.i.0
END
cname=STRIP(RIGHT(COMPRESS(path,' ._-:/'),29))
IF cname~='' & EXISTS(bbspath'Cache/'cname) THEN
DO cloop=1 TO 1
k=lists.0+1
lists.0=k
x=OPEN(f,bbspath'Cache/'cname'.','R')
IF x=0 THEN SAY bbspath'Cache/'cname'. failed to open!'CR
ELSE
DO
cpath=READLN(f)
IF cpath=path THEN lists.k=path
ELSE
DO
IF level=99 THEN
SAY path 'does not match cache path in' cname'. !'CR
CALL CLOSE(f)
lists.0=lists.0-1
LEAVE cloop
END
DO i=1
line=READLN(f)
IF EOF(f) THEN LEAVE i
IF colorflag~=1 THEN
DO
n=POS('1B'x,line)
DO WHILE n>0
DO m=2
IF DATATYPE(SUBSTR(line,n+m,1),'M') | (n+m+1)>LENGTH(line) THEN
leave m
END
line=DELSTR(line,n,m+1)
n=POS('1B'x,line)
END
END
lists.k.i=line
END
CALL CLOSE(f)
lists.k.ROWS=i-1
END
x=OPEN(f,bbspath'Cache/'cname,'R')
IF x=0 THEN
DO
SAY bbspath'Cache/cname failed to open!'CR
CALL CLOSE(f)
lists.0=lists.0-1
LEAVE cloop
END
ELSE
DO
plist=READCH(f,65000)
CALL CLOSE(f)
lists.k.0=plist
RETURN plist
END
END
SAY 'Loading...'CR
CALL FileList(path'*',filelist,'F','N')
IF filelist.0>1 THEN CALL QSORT(1,filelist.0,filelist)
CALL FileList(path'*',dirlist,'D','N')
IF dirlist.0>1 THEN CALL QSORT(1,dirlist.0,dirlist)
plist=''
dirs=0
longest=0
DO i=1 TO filelist.0
IF WORDS(filelist.i)~=1 THEN ITERATE i
IF filelist.i='' THEN ITERATE i
IF UPPER(RIGHT(filelist.i,5))='.INFO' THEN ITERATE i
IF FIND(exclude,UPPER(path||filelist.i))>0 THEN ITERATE i
plist=STRIP(plist filelist.i)
IF LENGTH(filelist.i)>longest THEN longest=LENGTH(filelist.i)
END
DO i=1 TO dirlist.0
IF WORDS(dirlist.i)~=1 THEN ITERATE i
IF FIND(exclude,UPPER(path||dirlist.i))>0 THEN ITERATE i
plist=STRIP(plist dirlist.i)
IF LENGTH(dirlist.i)>longest THEN longest=LENGTH(dirlist.i)
dirs=dirs+1
END
cols=76%(longest+9)
lists.0=lists.0+1
i=lists.0
lists.i=path
lists.i.0=plist
DROP filelist. dirlist.
RETURN plist
pick:
PARSE ARG list
selection=''
DO k=1 TO lists.0
IF path=lists.k THEN LEAVE k
END
IF ~DATATYPE(lists.k.ROWS,'N') THEN
DO
items=WORDS(list)
IF items<75 & dirs<25 THEN SAY 'Formatting' items 'items...'CR
ELSE SAY 'Please be patient, formatting' items 'items may take a while...'CR
lists.k.ROWS=(items%cols)+((items//cols)>0)
IF cols>items THEN cols=items
IF cols<1 THEN cols=1
longest=(76%cols)-8
lists.k=path
DO j=0 TO cols-1
DO i=1 TO lists.k.ROWS
thisnum=j*lists.k.ROWS+i
IF thisnum<=items THEN
DO
thisitem=WORD(list,thisnum)
filestat=STATEF(path||thisitem)
thisitem=LEFT(thisitem,longest)' '
IF WORD(filestat,1)='DIR' THEN
lists.k.i=lists.k.i||pen3'(dir) 'thisitem||def
ELSE
DO
bytes=WORD(filestat,2)
IF bytes<10000 THEN
lists.k.i=lists.k.i||RIGHT(bytes,5) thisitem
ELSE IF bytes>1023999 THEN
lists.k.i=lists.k.i||RIGHT(bytes%1024000,4)'m' thisitem
ELSE lists.k.i=lists.k.i||RIGHT(bytes%1024,4)'k' thisitem
END
END
END
END
IF level=99 & items>24 THEN
DO
SAY items 'items,' dirs 'dirs,' lists.k.ROWS 'rows'
OPTIONS PROMPT 'FileCache' path'? (Ny) > '
PULL junk
junk=LEFT(junk,1)
IF junk='Y' THEN
DO
CALL MAKEDIR(bbspath'Cache')
cname=STRIP(RIGHT(COMPRESS(path,' ._-:/'),29))
x=OPEN(f,bbspath'Cache/'cname,'W')
IF x=0 THEN SAY 'Unable to open cache file' cname'!'CR
ELSE
DO
CALL WRITECH(f,list)
CALL CLOSE(f)
END
x=OPEN(f,bbspath'Cache/'cname'.','W')
IF x=0 THEN
DO
SAY 'Unable to open cache file' cname'. !'CR
CALL DELETE(bbspath'Cache/'cname)
END
ELSE
DO
CALL WRITELN(f,path)
DO i=1 TO lists.k.ROWS
CALL WRITELN(f,TRIM(lists.k.i))
END
CALL CLOSE(f)
SAY path 'has been cached.'CR
END
END
END
END
IF selected~='' THEN
DO
SAY CR
w=WORDS(selected)
temp=pen3' 'w def'selected files.'
IF shosel~=1 THEN
DO
SAY pen3'selected:'def||CR
DO i=1 TO w
SAY WORD(selected,i)||CR
END
END
ELSE temp='Enter' pen3'SHOW S'def'elected to display'temp
SAY temp||CR
IF w>5 THEN shosel=1
END
SAY CR
SAY 'current path ='pen3 path||def||CR
SAY LEFT('-',75,'-')||CR
OPTIONS PROMPT ' - ['pen3'N'def']on-stop ['pen3'Q'def']uit ['pen3'RETURN'def']=Continue - '
DO i=1 TO lists.k.ROWS
SAY TRIM(lists.k.i)||CR
IF (i+2)//(linesperpage-1)=0 & nonstop~=1 THEN
DO
CALL whodat()
PULL junk
IF LEFT(UPPER(junk),1)='Q' THEN LEAVE i
IF LEFT(UPPER(junk),1)='N' THEN nonstop=1
IF colorflag=1 THEN SAY '1B'x'M'||LEFT('',75)||'1B'x'M'||CR
END
END
nonstop=0
SAY LEFT('-',75,'-')||CR
CALL whodat()
readflag=0
DO getloop=1
pstring=showtime()' Enter ''?'' for HELP > '
OPTIONS PROMPT pstring
PARSE PULL selection
IF selection='?' THEN
DO
CALL help()
OPTIONS PROMPT 'Press RETURN'
PULL junk
selection=';-)'
LEAVE getloop
END
IF WORDS(selection)>1 THEN
DO
IF LEFT(UPPER(selection),6)='SHOW S' THEN
DO
shosel=''
selection=';-)'
LEAVE getloop
END
IF UPPER(selection)='SELECT ALL' THEN
DO
IF path='' | RIGHT(path,1)=':' | POS(UPPER(path),UPPER(devlist))>0 THEN
DO
SAY CR
SAY pen3'*** Archiving entire devices at one time is NOT allowed! ***'def||CR
SAY CR
ITERATE getloop
END
CALL selall(path)
shosel=''
selection=':-)'
LEAVE getloop
END
ELSE IF UPPER(WORD(selection,1))='READ' THEN
DO
readflag=1
selection=STRIP(DELWORD(selection,1,1))
END
END
i=FIND('DONE' UPPER(list),UPPER(selection))
IF i=0 THEN
DO
i=FIND('DONE' UPPER(list),UPPER(selection':'))
IF i=0 THEN ITERATE getloop
selection=selection':'
END
IF selection='' & path='' THEN ITERATE getloop
ELSE IF i>1 THEN selection=WORD(list,i-1)
IF readflag=1 THEN
DO
endtest=UPPER(RIGHT(selection,4))
IF FIND('.ARC .DMS .LZH .LHA .ZIP .ZOO',endtest)>0 THEN
DO
CALL Contents.rexx(path||selection)
IF EXISTS('RAM:CONTENTS') THEN CALL showtext('RAM: CONTENTS')
END
ELSE CALL showtext(path selection)
readflag=0
selection=';-)'
END
LEAVE getloop
END
RETURN selection
selall: PROCEDURE EXPOSE selected pen3 def CR
PARSE ARG dir .
IF FIND(exclude,UPPER(dir))>0 THEN RETURN
SAY 'Processing'pen3 dir||def||CR
IF RIGHT(dir,1)~='/' THEN dir=dir'/'
filelist.=''
CALL FileList(dir'*',filelist,'F','F')
DO i=1 TO filelist.0
IF filelist.i='' THEN ITERATE i
IF FIND(UPPER(selected),UPPER(filelist.i))=0 & FIND(UPPER(selected),'22'x||UPPER(filelist.i)'22'x)=0 THEN
DO
IF WORDS(filelist.i)>1 THEN
DO
SAY 'Space(s) in filename! Unable to archive' filelist.i'.'CR
ITERATE i
END
selected=STRIP(selected filelist.i)
END
ELSE IF FIND(UPPER(selected),'22'x||UPPER(filelist.i)'22'x)>0 THEN
selected=DELWORD(selected,FIND(UPPER(selected),'22'x||UPPER(filelist.i)'22'x),1)
ELSE selected=DELWORD(selected,FIND(UPPER(selected),UPPER(filelist.i)),1)
END
dirlist.=''
IF FileList(dir'*',dirlist,'D','F')=0 THEN RETURN
DO j=1 TO dirlist.0
CALL selall(dirlist.j)
END
RETURN
showtext:
PARSE ARG tpath' 'textfile
test=RIGHT(tpath,1)
IF test~='' & test~=':' & test~='/' THEN tpath=tpath'/'
x=OPEN(f,STRIP(tpath||textfile),'R')
IF x=0 THEN RETURN
test=READCH(f,64)
mask=XRANGE(,'06'x)||XRANGE('0E'x,'1A'x)||XRANGE('1C'x,'1F'x)
IF VERIFY(test,mask,'M')>0 THEN
DO
CALL CLOSE(f)
testloc=VERIFY(test,mask,'M')
SAY '*** not an archive or a text file! ***'CR
SAY 'Character number' testloc 'is ASCII' C2D(SUBSTR(test,testloc,1))||CR
RETURN
END
CALL SEEK(f,0,'B')
OPTIONS PROMPT ' - ['pen3'N'def']on-stop ['pen3'Q'def']uit ['pen3'RETURN'def']=Continue - '
SAY CR
SAY '-' tpath||textfile '-'CR
DO i=1 WHILE ~EOF(f)
SAY COMPRESS(READLN(f),CR||'0C'x)||CR
IF i//(linesperpage-1)=0 & nonstop~=1 THEN
DO
CALL whodat()
PULL junk
IF LEFT(UPPER(junk),1)='Q' THEN LEAVE i
IF LEFT(UPPER(junk),1)='N' THEN nonstop=1
IF colorflag=1 | ADDRESS()~='BAUD'THEN
SAY '1B'x'M'||LEFT('',60)||'1B'x'M'||CR
END
END
CALL CLOSE(f)
IF i//(linesperpage-1)>1 THEN
DO
OPTIONS PROMPT ' - ['pen3'RETURN'def']=Continue - '
PULL junk
END
nonstop=0
RETURN
whodat:
IF ADDRESS()~='BAUD' THEN RETURN
MSG RIGHT(' ',66-LENGTH(name)) '1B'x'M'||'
'||'
'||' 'name' level 'level' '||'
'
CALL checkdcd()
RETURN
help:
SAY CR
SAY CR
SAY pen3'- HELP -'def
SAY CR
SAY 'You can navigate through directory levels using the following commands.'CR
SAY 'Remember that the name must appear in the display before you can select it.'CR
SAY 'Filenames are displayed with their filesizes on the left, and directories'CR
SAY 'will have a' pen3'(dir)'def' on their left.'CR
SAY CR
SAY 'To select an item from the displayed list, enter its name as displayed.'CR
SAY 'If the selected item is a' pen3'directory'def', its contents will be displayed.'CR
SAY 'If the selected item is a file, it is added to the ''selected'' list.'CR
SAY 'To remove a selected file from the list, enter its name again.'CR
SAY CR
SAY 'To display the parent directory, enter an ''empty'' RETURN'CR
SAY 'To read a textfile or see the contents of an archive, enter READ filename.'CR
SAY 'To select ALL items from the current display, including the contents of all'CR
SAY 'displayed directories and their sub-directories, enter SELECT ALL.'CR
SAY CR
SAY 'Enter'pen3 'DONE' def'to return to the BBS (and download any selected files)'CR
SAY CR
RETURN
showtime:
mins=(maxtime-TIME('E'))%60
secs=TRUNC((maxtime-TIME('E'))//60)
IF secs<10 THEN secs='0'secs
RETURN 'Time Remaining: 'mins':'secs
BREAK_E:
SAY CR
SAY pen3'*** CONTROL-E BREAK ***'def||CR
i=999999
RETURN ''
BREAK_C:
SAY CR
EXIT ''
/* bbsExtDL.baud */